{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Missing value imputation: ArbitraryNumberImputer\n",
    "\n",
    "\n",
    "ArbitraryNumberImputer replaces NA by an arbitrary value. It works for numerical variables. The arbitrary value needs to be defined by the user.\n",
    "\n",
    "When no variable list is passed, it will default to all numerical variables in the dataset.\n",
    "\n",
    "**For this demonstration, we use the Ames House Prices dataset produced by Professor Dean De Cock:**\n",
    "\n",
    "Dean De Cock (2011) Ames, Iowa: Alternative to the Boston Housing\n",
    "Data as an End of Semester Regression Project, Journal of Statistics Education, Vol.19, No. 3\n",
    "\n",
    "http://jse.amstat.org/v19n3/decock.pdf\n",
    "\n",
    "https://www.tandfonline.com/doi/abs/10.1080/10691898.2011.11889627\n",
    "\n",
    "The version of the dataset used in this notebook can be obtained from [Kaggle](https://www.kaggle.com/c/house-prices-advanced-regression-techniques/data)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "from feature_engine.imputation  import ArbitraryNumberImputer"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Id</th>\n",
       "      <th>MSSubClass</th>\n",
       "      <th>MSZoning</th>\n",
       "      <th>LotFrontage</th>\n",
       "      <th>LotArea</th>\n",
       "      <th>Street</th>\n",
       "      <th>Alley</th>\n",
       "      <th>LotShape</th>\n",
       "      <th>LandContour</th>\n",
       "      <th>Utilities</th>\n",
       "      <th>...</th>\n",
       "      <th>PoolArea</th>\n",
       "      <th>PoolQC</th>\n",
       "      <th>Fence</th>\n",
       "      <th>MiscFeature</th>\n",
       "      <th>MiscVal</th>\n",
       "      <th>MoSold</th>\n",
       "      <th>YrSold</th>\n",
       "      <th>SaleType</th>\n",
       "      <th>SaleCondition</th>\n",
       "      <th>SalePrice</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>60</td>\n",
       "      <td>RL</td>\n",
       "      <td>65.0</td>\n",
       "      <td>8450</td>\n",
       "      <td>Pave</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Reg</td>\n",
       "      <td>Lvl</td>\n",
       "      <td>AllPub</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>2008</td>\n",
       "      <td>WD</td>\n",
       "      <td>Normal</td>\n",
       "      <td>208500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>20</td>\n",
       "      <td>RL</td>\n",
       "      <td>80.0</td>\n",
       "      <td>9600</td>\n",
       "      <td>Pave</td>\n",
       "      <td>NaN</td>\n",
       "      <td>Reg</td>\n",
       "      <td>Lvl</td>\n",
       "      <td>AllPub</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>5</td>\n",
       "      <td>2007</td>\n",
       "      <td>WD</td>\n",
       "      <td>Normal</td>\n",
       "      <td>181500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>60</td>\n",
       "      <td>RL</td>\n",
       "      <td>68.0</td>\n",
       "      <td>11250</td>\n",
       "      <td>Pave</td>\n",
       "      <td>NaN</td>\n",
       "      <td>IR1</td>\n",
       "      <td>Lvl</td>\n",
       "      <td>AllPub</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>9</td>\n",
       "      <td>2008</td>\n",
       "      <td>WD</td>\n",
       "      <td>Normal</td>\n",
       "      <td>223500</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>70</td>\n",
       "      <td>RL</td>\n",
       "      <td>60.0</td>\n",
       "      <td>9550</td>\n",
       "      <td>Pave</td>\n",
       "      <td>NaN</td>\n",
       "      <td>IR1</td>\n",
       "      <td>Lvl</td>\n",
       "      <td>AllPub</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>2</td>\n",
       "      <td>2006</td>\n",
       "      <td>WD</td>\n",
       "      <td>Abnorml</td>\n",
       "      <td>140000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>60</td>\n",
       "      <td>RL</td>\n",
       "      <td>84.0</td>\n",
       "      <td>14260</td>\n",
       "      <td>Pave</td>\n",
       "      <td>NaN</td>\n",
       "      <td>IR1</td>\n",
       "      <td>Lvl</td>\n",
       "      <td>AllPub</td>\n",
       "      <td>...</td>\n",
       "      <td>0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>0</td>\n",
       "      <td>12</td>\n",
       "      <td>2008</td>\n",
       "      <td>WD</td>\n",
       "      <td>Normal</td>\n",
       "      <td>250000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>5 rows × 81 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "   Id  MSSubClass MSZoning  LotFrontage  LotArea Street Alley LotShape  \\\n",
       "0   1          60       RL         65.0     8450   Pave   NaN      Reg   \n",
       "1   2          20       RL         80.0     9600   Pave   NaN      Reg   \n",
       "2   3          60       RL         68.0    11250   Pave   NaN      IR1   \n",
       "3   4          70       RL         60.0     9550   Pave   NaN      IR1   \n",
       "4   5          60       RL         84.0    14260   Pave   NaN      IR1   \n",
       "\n",
       "  LandContour Utilities  ... PoolArea PoolQC Fence MiscFeature MiscVal MoSold  \\\n",
       "0         Lvl    AllPub  ...        0    NaN   NaN         NaN       0      2   \n",
       "1         Lvl    AllPub  ...        0    NaN   NaN         NaN       0      5   \n",
       "2         Lvl    AllPub  ...        0    NaN   NaN         NaN       0      9   \n",
       "3         Lvl    AllPub  ...        0    NaN   NaN         NaN       0      2   \n",
       "4         Lvl    AllPub  ...        0    NaN   NaN         NaN       0     12   \n",
       "\n",
       "  YrSold  SaleType  SaleCondition  SalePrice  \n",
       "0   2008        WD         Normal     208500  \n",
       "1   2007        WD         Normal     181500  \n",
       "2   2008        WD         Normal     223500  \n",
       "3   2006        WD        Abnorml     140000  \n",
       "4   2008        WD         Normal     250000  \n",
       "\n",
       "[5 rows x 81 columns]"
      ]
     },
     "execution_count": 2,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "data = pd.read_csv('houseprice.csv')\n",
    "data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "((1022, 79), (438, 79))"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# let's separate into training and testing set\n",
    "\n",
    "X_train, X_test, y_train, y_test = train_test_split(\n",
    "    data.drop(['Id', 'SalePrice'], axis=1), data['SalePrice'], test_size=0.3, random_state=0)\n",
    "\n",
    "X_train.shape, X_test.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "ArbitraryNumberImputer(arbitrary_number=-999,\n",
       "                       variables=['LotFrontage', 'MasVnrArea'])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# let's create an instance of the imputer where we impute\n",
    "# 2 variables with the same arbitraty number\n",
    "\n",
    "arbitrary_imputer = ArbitraryNumberImputer(\n",
    "    arbitrary_number=-999, variables=['LotFrontage', 'MasVnrArea'])\n",
    "\n",
    "\n",
    "arbitrary_imputer.fit(X_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "-999"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# the number to use in the imputation\n",
    "arbitrary_imputer.arbitrary_number"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'LotFrontage': -999, 'MasVnrArea': -999}"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# the imputer will use the same value in all the\n",
    "# indicated variables\n",
    "\n",
    "arbitrary_imputer.imputer_dict_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LotFrontage   -999.0\n",
       "MasVnrArea    -999.0\n",
       "dtype: float64"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train_t = arbitrary_imputer.transform(X_train)\n",
    "test_t = arbitrary_imputer.transform(X_test)\n",
    "\n",
    "train_t[['LotFrontage', 'MasVnrArea']].min()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x117fd32670>"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZYAAAD4CAYAAADPccAIAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nO3de3xU1b3//9cnk0AQ5CJG5aICilYURQyIj9ZLLyogim31W7xUtD2lnEKPPX5rxcvx1q+/9mj1WI8eqVaO2FKolxZpDx61tlV71Eo44gWUCmg1gtxUQBKSzMzn98fek0wmM8kkmSGE/X4+HvPIzN5r7VkrmeSTddlrmbsjIiJSKCVdXQAREdm7KLCIiEhBKbCIiEhBKbCIiEhBKbCIiEhBlXZ1AbrS/vvv78OGDevqYoiIdCvLly/f4u4Vuc5HOrAMGzaMqqqqri6GiEi3YmZ/b+28usJERKSgFFhERKSgFFhERKSgIj3GIiLdQ0NDA9XV1ezataurixIp5eXlDB06lLKysnblU2ARkT1edXU1++67L8OGDcPMuro4keDubN26lerqaoYPH96uvOoKE5E93q5duxg4cKCCym5kZgwcOLBDrcSiBhYzm2hmq81sjZnNyXLezOyu8PxrZjY2PH6wmf3JzN40s5Vmdnlanv3M7Gkzezv8OiDt3NXhtVab2ZnFrJuI7F4KKrtfR7/nRQssZhYD7gEmAaOAC8xsVEayScDI8DEDuDc8Hgf+r7sfBUwAZqXlnQM84+4jgWfC14TnpwFHAxOB/wjLICK70dOrNvK3jTu6uhjShYrZYhkPrHH3de5eDywCpmakmQo85IGXgP5mNsjdN7j7/wK4+w7gTWBIWp754fP5wLlpxxe5e527vwOsCcsgIrtJMul866Eqptz1l64uSsH16dMn77QPPvgg69evb3x92mmnceSRRzJmzBjGjBnDo48+2unyLF68mFWrVnX6OsVQzMAyBHg/7XU1TcEh7zRmNgw4HvhreOhAd98AEH49oB3vh5nNMLMqM6vavHlzO6ojIm3ZURcHoD6R7OKSdK3MwAKwYMECVqxYwYoVKzjvvPOanUskEu1+j6gGlmydc5nbVbaaxsz6AI8B33P37QV4P9z9PnevdPfKioqcS92ISAfUNbT/D2R3tmLFCiZMmMCxxx7Ll7/8ZT7++GMeffRRqqqquOiiixgzZgy1tbVZ8w4bNoybb76Zz33uczzyyCMsXLiQ0aNHc8wxx3DVVVc1puvTpw/XXnstxx13HBMmTGDjxo288MILLFmyhCuvvJIxY8awdu1a7r//fsaNG8dxxx3HV7/6VWpqagBYu3YtEyZMYNy4cVx//fXNWl633XYb48aN49hjj+WGG24o2PelmNONq4GD014PBdbnm8bMygiCygJ3/01amo2p7jIzGwRsasf7iUgR1aYFlpr6OPv0KPyfmJt+t5JV69v6P7N9Rg3uyw1nH93ufJdccgn//u//zqmnnsr111/PTTfdxJ133sndd9/NT37yEyorKxvTXnTRRfTq1QuAZ555BgjuE/nLX/7C+vXrmTBhAsuXL2fAgAGcccYZLF68mHPPPZedO3cyYcIEbrnlFn7wgx9w//33c91113HOOecwZcqUxtZP//79+da3vgXAddddxwMPPMB3v/tdLr/8ci6//HIuuOAC5s6d21iep556irfffpuXX34Zd+ecc87hueee45RTTunw9zGlmC2WZcBIMxtuZj0IBtaXZKRZAlwSzg6bAGwLA4YBDwBvuvsdWfJMD59PBx5POz7NzHqa2XCCCQEvF75aIpJLemD5cNvefTPjtm3b+OSTTzj11FMBmD59Os8991zO9OldYQMHDgTga1/7GgDLli3jtNNOo6KigtLSUi666KLGa/Xo0YMpU6YAcMIJJ/Duu+9mvf4bb7zBySefzOjRo1mwYAErV64E4MUXX+T8888H4MILL2xM/9RTT/HUU09x/PHHM3bsWN566y3efvvtTnxHmhStxeLucTObDTwJxIB57r7SzGaG5+cCS4HJBAPtNcBlYfbPAl8HXjezFeGxa9x9KfBj4GEz+ybwHnB+eL2VZvYwsIpgVtksd49Wu1yki9XWN/3Kbdxex4iK/Ae889WRlsWeqnfv3kBwM2IuZWVljdN+Y7EY8Xg8a7pLL72UxYsXc9xxx/Hggw/y5z//udX3dneuvvpqvv3tb3es8K0o6n0s7r7U3Y9w98Pc/Zbw2NwwqBDOBpsVnh/t7lXh8b+4u7n7se4+JnwsDc9tdfcvuvvI8OtHae93S3itI939iWLWTURa2tXQNGi/cfve3WLp168fAwYM4PnnnwfgF7/4RWPrZd9992XHjvynXJ944ok8++yzbNmy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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# we can see that the distribution has changed \n",
    "# with now more values accumulating towards the arbitrary value\n",
    "\n",
    "fig = plt.figure()\n",
    "ax = fig.add_subplot(111)\n",
    "X_train['LotFrontage'].plot(kind='kde', ax=ax)\n",
    "train_t['LotFrontage'].plot(kind='kde', ax=ax, color='red')\n",
    "lines, labels = ax.get_legend_handles_labels()\n",
    "ax.legend(lines, labels, loc='best')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Passing a dictionary with variable names and values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "ArbitraryNumberImputer(imputer_dict={'LotFrontage': -678, 'MasVnrArea': -789},\n",
       "                       variables=dict_keys(['LotFrontage', 'MasVnrArea']))"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# we can also impute different variables with different values\n",
    "\n",
    "arbitrary_imputer = ArbitraryNumberImputer(\n",
    "    imputer_dict={\"LotFrontage\":-678,\"MasVnrArea\":-789}\n",
    ")\n",
    "\n",
    "arbitrary_imputer.fit(X_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'LotFrontage': -678, 'MasVnrArea': -789}"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "arbitrary_imputer.imputer_dict_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "LotFrontage   -678.0\n",
       "MasVnrArea    -789.0\n",
       "dtype: float64"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# now we impute the missing data\n",
    "\n",
    "train_t = arbitrary_imputer.transform(X_train)\n",
    "test_t = arbitrary_imputer.transform(X_test)\n",
    "\n",
    "train_t[['LotFrontage', 'MasVnrArea']].min()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.legend.Legend at 0x117fe610a0>"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# we can see that the distribution has changed \n",
    "# with now more values accumulating towards the arbitrary value\n",
    "\n",
    "fig = plt.figure()\n",
    "ax = fig.add_subplot(111)\n",
    "X_train['LotFrontage'].plot(kind='kde', ax=ax)\n",
    "train_t['LotFrontage'].plot(kind='kde', ax=ax, color='red')\n",
    "lines, labels = ax.get_legend_handles_labels()\n",
    "ax.legend(lines, labels, loc='best')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "fengine",
   "language": "python",
   "name": "fengine"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.2"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
